--[[ $Id: scene3.lua 479 2013-09-27 05:44:13Z dbzoo.com $ Copyright (c) Brett England, 2013 No commercial use. No redistribution at profit. All derivative work must retain this message and acknowledge the work of the original author. --]] local storyboard = require "storyboard" local widget = require "widget" local xap = require "hahlib.xap.init" local scene = storyboard.newScene() function scene:createScene( event ) local group = self.view -- Use a slider widget as a feedback mechanism... -- A little lame as the slider can't be made read-only so the user -- still can interact with the Object. Its only a demo. function levelController(opt) return function(event) -- Normalize the slider 0-100 value into the range 0->(states-1) local idx = 0 if event.value > 0 then idx = math.ceil(event.value/ (100/#opt.states))-1 end local temperature=opt.states[idx+1] opt.listener(temperature) if event.phase == "ended" then bscSend{target=opt.xapTarget, text=temperature, state="on"} print(string.format("bsc.sendText(%s, %s)", opt.xapTarget, temperature)) end end end function newHorizSliderWithFeedback(opt) local textFeedback = display.newText{ text = string.format(opt.msg, "?"), x=opt.width / 2, y=opt.top + 40, fontSize=30 } function updateFeedback(desc) textFeedback.text = string.format(opt.msg, desc) end local controller = levelController{ states = opt.states, listener = updateFeedback, xapTarget = opt.xapTarget } local horizontalSlider = widget.newSlider { top=opt.top, left=opt.left, width = opt.width, orientation = "horizontal", listener = controller } -- Monitor so a change will update the slider local f = xap.Filter() f:add("xap-header","source",opt.xapTarget) f:add("xap-header","class","xAPBSC.event") f:callback(function(frame) local temp = frame:getValue("output.state","text") if temp == nil then return end local sliderlevel = ((temp-opt.states[1]) / #opt.states) * 100 if sliderLevel < 0 then sliderLevel = 0 end horizontalSlider:setValue( sliderlevel ) -- Synthetic event to update internal state and fire text feedback. controller{value=sliderlevel} end ) xap_server:addFilter(f) local grp = display.newGroup() grp:insert(horizontalSlider) grp:insert(textFeedback) return grp end ---- MAIN ---- -- Define the thermostat range the slider will operate in. stateTemp={} for i=5,23 do table.insert(stateTemp,i) end margin=20 newHorizSliderWithFeedback { top=0, left=margin, width = display.actualContentWidth-margin*2, states = stateTemp, msg = "Heating Set at %sC", xapTarget="dbzoo.livebox.kema:Heating.thermostat" } end scene:addEventListener( "createScene", scene ) return scene